Scroll to navigation

MALLOC(3) Руководство программиста Linux MALLOC(3)

ИМЯ

malloc, free, calloc, realloc - распределяет и освобождает динамическую память

ОБЗОР

#include <stdlib.h>

void *malloc(size_t size);
void free(void *ptr);
void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);

ОПИСАНИЕ

Функция malloc() распределяет size байтов и возвращает указатель на распределённую память. Память при этом не инициализируется. Если значение size равно 0, то malloc() возвращает или NULL, или уникальный указатель, который можно без опасений передавать free().

Функция free() освобождает место в памяти, указанное в ptr, которое должно быть получено ранее вызовом функции malloc(), calloc() или realloc(). Иначе (или если вызов free(ptr) уже выполнялся) дальнейшее поведение не определено. Если значение ptr равно NULL, то не выполняется никаких действий.

Функция сalloc() распределяет память для массива размером nmemb элементов по size байтов каждый и возвращает указатель на распределённую память. Данные в выделенной памяти при этом обнуляются. Если значение nmemb или size равно 0, то calloc() возвращает или NULL, или уникальный указатель, который можно без опасений передавать free().

Функция realloc() меняет размер блока памяти, на который указывает ptr, на размер, равный size байт. Содержимое памяти не будет изменено от начала области в пределах наименьшего из старого и нового размеров. Если новый размер больше старого, то добавленная память не будет инициализирована. Если значение ptr равно NULL, то вызов эквивалентен malloc(size) для всех значений size; если значение size равно нулю и ptr не равно NULL, то вызов эквивалентен free(ptr). Если только значение ptr не равно NULL, то должно быть возвращено ранее полученное значение от malloc(), calloc() или realloc(). Если область была перемещена, то выполняется free(ptr).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функции malloc() и calloc() возвращают указатель на распределённую память, выровненную должным образом для любого типа переменных. При ошибке возвращается NULL. Значение NULL также может быть получено при успешной работе вызова malloc(), если значение size равно нулю, или calloc() — если значение nmemb или size равно нулю.

Функция free() ничего не возвращает.

Функция realloc() возвращает указатель на новую распределённую память, выровненную должным образом для любого типа переменных. Возвращаемый указатель может отличаться от ptr, или равняться NULL, если запрос завершился с ошибкой. Если значение size было равно нулю, то возвращается либо NULL, либо указатель, который может быть передан free(). Если realloc() завершилась с ошибкой, то начальный блок памяти остаётся нетронутым: он не освобождается или перемещается.

СООТВЕТСТВИЕ СТАНДАРТАМ

C89, C99.

ЗАМЕЧАНИЯ

По умолчанию, Linux придерживается оптимистичной стратегии распределения памяти. Это означает, что когда malloc() возвращает значение не NULL, то нет никаких гарантий, что память в действительности доступна. Если обнаружится, что системе не хватает памяти, то один или несколько процессов будут завершены OOM. Дополнительную информацию можно получить из описания /proc/sys/vm/overcommit_memory и /proc/sys/vm/oom_adj в proc(5) и файле из исходного кода ядра Documentation/vm/overcommit-accounting.

Обычно, malloc() распределяет память из кучи и подгоняет размер кучи соответствующим образом с помощью sbrk(2). Если распределяемый блок памяти больше чем MMAP_THRESHOLD байт, то реализация malloc() в glibc распределяет память с помощью mmap(2) в виде частного анонимного отображения. По умолчанию, значение MMAP_THRESHOLD равно 128 КБ, но его можно изменить с помощью mallopt(3). На распределения, выполняемые с помощью mmap(2), не влияет ограничитель ресурса RLIMIT_DATA (смотрите getrlimit(2)).

Внутри данных функций для защиты от повреждений выделяемых структур данных управления памятью, используются мьютексы. В многонитиевых приложениях, в которых нити одновременно выделяют и освобождают память, может возникнуть конфликт за обладание этими мьютексами. Чтобы расширить обработку выделения памяти в многонитиевых приложениях библиотека glibc создаёт дополнительные дополнительные области выделения памяти, если обнаруживается конфликт. Каждая область представляет собой большой кусок памяти, который внутренне выделен системой (с помощью brk(2) или mmap(2)) и управляется своими собственными мьютексами.

Стандарт UNIX 98 требует, чтобы функции malloc(), calloc() и realloc() при ошибках присваивали значение ENOMEM переменной errno. Glibc допускает, что это уже реализовано (и версии glibc этих функций делают это); если вы используете свою реализацию функции malloc, которая не изменяет errno, то некоторые функции библиотеки могут закончить работу с ошибкой без указания причины в errno.

Аварийные ситуации в malloc(), calloc(), realloc() или free() почти всегда связаны с повреждением кучи, например, с переполнением больших распределённых участков памяти или освобождением одного и того же указателя дважды.

В новых версиях библиотек Linux libc (новее чем 5.4.23) и glibc (2.x) содержится реализация malloc(), которая настраивается с помощью переменных окружения. Описание этой возможности смотрите в mallopt(3).

СМОТРИТЕ ТАКЖЕ

brk(2), mmap(2), alloca(3), malloc_get_state(3), malloc_info(3), malloc_trim(3), malloc_usable_size(3), mallopt(3), mcheck(3), mtrace(3), posix_memalign(3)

2012-05-10 GNU